package com.ecommerce.user.service;

import com.ecommerce.user.dto.*;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;

/**
 * 用户服务接口
 */
public interface UserService {

    /**
     * 用户注册
     * @param registerRequest 注册请求
     * @return 用户响应
     */
    UserResponse register(UserRegisterRequest registerRequest);

    /**
     * 用户登录
     * @param loginRequest 登录请求
     * @return 登录响应
     */
    UserLoginResponse login(UserLoginRequest loginRequest);

    /**
     * 根据ID获取用户信息
     * @param userId 用户ID
     * @return 用户响应
     */
    UserResponse getUserById(Long userId);

    /**
     * 根据用户名获取用户信息
     * @param username 用户名
     * @return 用户响应
     */
    UserResponse getUserByUsername(String username);

    /**
     * 更新用户信息
     * @param userId 用户ID
     * @param updateRequest 更新请求
     * @return 更新后的用户信息
     */
    UserResponse updateProfile(Long userId, UpdateProfileRequest updateRequest);

    /**
     * 修改密码
     * @param userId 用户ID
     * @param changePasswordRequest 修改密码请求
     * @return 是否修改成功
     */
    boolean changePassword(Long userId, ChangePasswordRequest changePasswordRequest);

    /**
     * 更新用户头像
     * @param userId 用户ID
     * @param avatarUrl 头像URL
     * @return 更新后的用户信息
     */
    UserResponse updateAvatar(Long userId, String avatarUrl);

    /**
     * 同步用户数据（从认证服务）
     * @param syncRequest 同步请求
     */
    void syncUser(com.ecommerce.user.controller.UserController.SyncUserRequest syncRequest);

    /**
     * 同步用户密码（从认证服务）
     * @param userId 用户ID
     * @param encodedPassword 已加密的密码
     */
    void syncPassword(Long userId, String encodedPassword);

    // ===== 管理员相关方法 =====

    /**
     * 获取用户列表（管理员）
     * @param keyword 搜索关键词
     * @param userType 用户类型
     * @param status 用户状态
     * @param pageable 分页信息
     * @return 用户分页列表
     */
    Page<UserResponse> getUsers(String keyword, String userType, Boolean status, Pageable pageable);

    /**
     * 创建用户（管理员）
     * @param userRequest 用户请求数据
     * @return 创建的用户信息
     */
    UserResponse createUser(UpdateUserRequest userRequest);

    /**
     * 更新用户（管理员）
     * @param userId 用户ID
     * @param userRequest 用户请求数据
     * @return 更新的用户信息
     */
    UserResponse updateUser(Long userId, UpdateUserRequest userRequest);

    /**
     * 删除用户（管理员）
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean deleteUser(Long userId);

    /**
     * 批量删除用户（管理员）
     * @param userIds 用户ID列表
     * @return 是否删除成功
     */
    boolean batchDeleteUsers(List<Long> userIds);

    /**
     * 更新用户状态（管理员）
     * @param userId 用户ID
     * @param enabled 是否启用
     * @return 是否更新成功
     */
    boolean updateUserStatus(Long userId, boolean enabled);

    /**
     * 重置用户密码（管理员）
     * @param userId 用户ID
     * @return 是否重置成功
     */
    boolean resetUserPassword(Long userId);

    /**
     * 获取用户统计信息（管理员）
     * @return 用户统计信息
     */
    UserStatsResponse getUserStats();
}